package service.impl;

import dao.CategoryDao;
import dao.impl.CategoryDaoImpl;
import domain.Category;
import service.CategoryService;
import util.JedisUtil;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * @author: 爱学Java 不想秃头的 KK
 * @date: 2023/6/26 20:56
 * @version: 1.0
 * @Created with IntelliJ IDEA.
 * @Description:
 */
public class CategoryServiceImpl implements CategoryService {
    private CategoryDao categoryDao = new CategoryDaoImpl();

//    @Override
    public List<Category> findAll2() {
        //1.从redis中查询
        //1.1获取redis客户端
        Jedis jedis = JedisUtil.getJedis();
        //1.2可使用sortedSet排序查询
        Set<Tuple> categorys = jedis.zrangeWithScores("category", 0, -1);
        List<Category> list = null;
        //2.判断查询的集合是否为空
        if(categorys == null || categorys.size() == 0){
            System.out.println("从数据库查询.....");
            //3.如果为空，需要从数据库查询，再将数据存入到redis中
            //3.从数据库查询
            list = categoryDao.findAll();
            //3.2 将数据集合存储到redis中的 category 的 key中
            for (int i = 0; i < list.size(); i++) {
                jedis.zadd("category",list.get(i).getCid(),list.get(i).getCname());
            }
        }else {
            System.out.println("从redis中查询.....");
            //4.如果不为空，将set的数据存入到list中
            list = new ArrayList<Category>();
            for (Tuple tuple : categorys) {
                //由于categorys是Set集合,在序列化的时候传入的对象为Lsit集合
                //要先将Set集合转化为List集合再序列化
                Category category = new Category();
                category.setCid((int)tuple.getScore());
                category.setCname(tuple.getElement());
                list.add(category);
            }
        }
        return list;
    }

    @Override
    public List<Category> findAll() {

        List<Category> list = null;
        System.out.println("从数据库查询.....");
        //3.如果为空，需要从数据库查询，再将数据存入到redis中
        //3.从数据库查询
        list = categoryDao.findAll();
        return list;
    }
}
